package com.lzh.team.service;

import com.lzh.team.domain.Architect;
import com.lzh.team.domain.Designer;
import com.lzh.team.domain.Employee;
import com.lzh.team.domain.Programmer;

/**
 * 关于开发团队的增加，删除
 * 
 * @author Dell
 *
 */
public class TeamService {

	private static int count = 1;// 给memberId赋值
	private final int MAX_MEMBER = 5;// 用来限制开发团队的人数
	private Programmer[] team = new Programmer[MAX_MEMBER];// 保存开发团队成员
	private int total;// 记录开发团队中实际的人数

	public TeamService() {
		super();
	}

	/**
	 * 获取开发团队中的所有成员
	 * 
	 * @return
	 * @author liuzhihao
	 * @date 2021年2月10日下午11:56:09
	 */
	public Programmer[] getTeam() {

		Programmer[] team = new Programmer[total];
		for (int i = 0; i < team.length; i++) {
			team[i] = this.team[i];
		}
		return team;
	}

	/**
	 * 将指定的员工添加到开发团队中
	 * 
	 * @param e
	 * @author liuzhihao
	 * @throws TeamException
	 * @date 2021年2月10日下午11:59:30
	 */
	public void addMember(Employee e) throws TeamException {

		// 成员已满，无法添加
		if (total >= MAX_MEMBER) {
			throw new TeamException("成员已满，无法添加");
		}
		if (!(e instanceof Programmer)) {
			throw new TeamException("该成员不是开发成员，无法添加");
		}
		if (isExist(e)) {
			throw new TeamException("该员工已在本开发团队中");
		}

		Programmer p = (Programmer) e;// 一定不会出现ClassCastException（类型转换异常）
		if ("BUSY".equals(p.getStatus().getNAME())) {// if(p.getStatus().getNAME().equals("BUSY")) {
			throw new TeamException("该员工已经是某团队的成员");
		} else if ("VOCATION".equals(p.getStatus().getNAME())) {
			throw new TeamException("该员工正在休假，无法添加");
		}

		// 获取team中已有的成员中架构师、设计师、程序员的人数；
		int numOfArch = 0, numOfDes = 0, numOfPro = 0;
		for (int i = 0; i < total; i++) {
			if (team[i] instanceof Architect) {
				numOfArch++;
			} else if (team[i] instanceof Designer) {
				numOfDes++;
			} else if (team[i] instanceof Programmer) {
				numOfPro++;
			}
		}

		if (p instanceof Architect) {
			if (numOfArch >= 1) {
				throw new TeamException("团队中至多只能有一名架构师");
			}
		} else if (p instanceof Designer) {
			if (numOfDes >= 2) {
				throw new TeamException("团队中至多只能有两名设计师");
			}
		} else if (p instanceof Programmer) {
			if (numOfPro >= 3) {
				throw new TeamException("团队中至多只能有三名程序员");
			}
		}

		// 将p(或e)添加到现有的team中
		team[total++] = p;
		// p的属性赋值
		p.setStatus(Status.BUSY);
		p.setMemberId(count++);

	}

	/**
	 * 判断指定的员工
	 * 
	 * @param e
	 * @return
	 * @author liuzhihao
	 * @date 2021年2月11日下午2:23:27
	 */
	private boolean isExist(Employee e) {
		for (int i = 0; i < total; i++) {
			return e.getId() == team[i].getId();
		}
		return false;
	}

	/**
	 * 从团队中删除成员
	 * 
	 * @param memberId
	 * @author liuzhihao
	 * @throws TeamException
	 * @date 2021年2月11日下午4:06:39
	 */
	public void removeMember(int memberId) throws TeamException {
		int i = 0;
		for (; i < total; i++) {
			if (team[i].getMemberId() == memberId) {
				team[i].setStatus(Status.FREE);
				break;
			}
		}
		// 未找到指定memberId的情况
		if (i == total) {
			throw new TeamException("找不到指定memberId的员工，删除失败");
		}
		// 后一个的元素覆盖前一个元素，实现删除操作
		for (int j = i + 1; j < total; j++) {
			team[j - 1] = team[j];
		}
		team[--total] = null;

	}

}
